package com.tencent.system.service.impl;

import com.tencent.system.domain.Role;
import com.tencent.system.mapper.RoleMapper;
import com.tencent.system.service.IRoleService;
import com.tencent.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 业务实现类：
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    @Transactional
    public void save(Role role) {
        // 先添加到数据库 才有自增长的id
        super.save(role);

        // 调用类中私有方法
        addData(role);
    }

    /**
     * 将添加的逻辑代码抽出来 共用
     */
    private void addData(Role role) {
        // 获取到前端传递过来的menus
        List<Long> menus = role.getMenus();
        if (menus.size() > 0) { // 如果menus有值
            // 调用方法 将role_id传递 并且 menus也传递 在xml中循环批量添加到t_role_menu中
            roleMapper.saveRoleMenu(role.getId(), menus);
            // ↑这里涉及到mybatis的多参数传递 - 四种方式 - 常用Map和Mapper接口中@Param注解【推荐】
        }

        // 获取到前端传递过来的permissions
        List<Long> permissions = role.getPermissions();
        if (permissions.size() > 0) {
            // 将role_id传递 并且permissions也传递 在xml中循环批量添加到t_role_permission中
            roleMapper.saveRolePermisson(role.getId(), permissions);
        }
    }

    @Override
    @Transactional
    public void update(Role role) {
        // 修改的时候将相关联的三个中间表数据删除
        roleMapper.delRoleMenuByRoleId(role.getId());
        roleMapper.delRolePermissionByRoleId(role.getId());
        roleMapper.delEmployeeRoleByRoleId(role.getId());

        // 调用类中私有方法 再次添加新的权限
        addData(role);

        super.update(role);
    }

    @Override
    @Transactional
    public void remove(Long id) {

        // 删除的时候将相关联的三个中间表数据删除
        roleMapper.delRoleMenuByRoleId(id);
        roleMapper.delRolePermissionByRoleId(id);
        roleMapper.delEmployeeRoleByRoleId(id);

        // 因为有外键关联 - 所以先删除关联数据 - 最后再删除角色本身主数据
        super.remove(id);

    }

    @Override
    @Transactional
    public void patchDelete(Long[] ids) {
        for (Long id : ids) {
            remove(id);
        }
    }
}
